package com.aatattoo.light_food_service.service;

import com.aatattoo.light_food_service.mapper.TokenMapper;
import com.aatattoo.light_food_service.entity.Token;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
@Component
public class TokenService {
    @Autowired
    private TokenMapper tokenMapper;

    /**
     * 新增用户token
     * @param token
     * @return
     */
    public int addToken(Token token){
        return tokenMapper.addToken(token);
    }

    /**
     * 更新token（id）
     * @param token
     * @return
     */
    public int updataToken(Token token){
        return tokenMapper.updataToken(token);
    }

    /**
     * 查找token信息（userID）
     * @param userId
     * @return
     */
    public Token findByUserId(int userId){
        return tokenMapper.findByUserId(userId);
    }

    /**
     * 检查token是否存在
     * @param userId
     * @return
     */
    public int isTableExist(int userId){
        return tokenMapper.isTableExist(userId);
    }

    /**
     * 使用用户id，签名，时间，生成token加密标识符
     * @param userId
     * @param date
     * @return
     */
    public String creatToken(int userId, Date date) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT") // 设置header
                .setHeaderParam("alg", "HS256")
                .setIssuedAt(date) // 设置签发时间
                .setExpiration(new Date(date.getTime() + 1000 * 60 * 60 * 24 * 3)) //设置过期时间
                .claim("userid",String.valueOf(userId)) // 设置内容
                .setIssuer("aatattoo")// 设置签发人
                .signWith(signatureAlgorithm, "account"); // 签名，需要算法和key
        String jwt = builder.compact();
        return jwt;
    }

    /**
     * 解析token，返回用户id
     * @param token
     * @return
     */
    public int analysisUserId(String token){
//        Claims claims = Jwts.parser().setSigningKey("account").parseClaimsJws(token).getBody();
        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey("account")
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) {
            claims = e.getClaims();
        }
        String tokenUserId=(String)claims.get("userid");
        return Integer.parseInt(tokenUserId);
    }

}
